﻿using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;

namespace SetupBuilder
{
    /// <summary>
    /// Обрабатывает файл с параметрами проекта Wix.
    /// </summary>
    public class WixVariables
    {
        /// <summary>
        /// Содержание файла спараметрами проекта.
        /// </summary>
        private string fileContent;

        /// <summary>
        /// Открывает файл с параметрами проекта.
        /// </summary>
        /// <param name="path">Путь до файла с параметрами.</param>
        public WixVariables(string path)
        {
            using (var sr = new StreamReader(path, Encoding.UTF8))
            {
                this.fileContent = sr.ReadToEnd();
            }
        }

        /// <summary>
        /// Изменяет параметры проекта в соответствющем файле.
        /// </summary>
        /// <param name="elementName">Имя параметра.</param>
        /// <param name="newValue">Новое значение параметра.</param>
        public void ChangeElementValue(string elementName, string newValue)
        {
            if (string.IsNullOrEmpty(elementName))
            {
                throw new ArgumentException("Имя имзеняемого элемента не может быть пустым");
            }

            fileContent = Regex.Replace(
                this.fileContent,
                string.Format("define\\s{0}\\s?=\\s?['\"].*?['\"]", elementName),
                string.Format("define {0}=\"{1}\"", elementName, newValue));
        }

        /// <summary>
        /// Возвращает значение указанного элемента.
        /// </summary>
        /// <param name="elementName">Имя элемента.</param>
        /// <returns>Возвращает значение указанного элемента.</returns>
        public string GetElementValue(string elementName)
        {
            return Regex.Match(
                this.fileContent,
                string.Format("define\\s{0}\\s?=\\s?['\"](.*?)['\"]", elementName)).Groups[1].Value;
        }

        /// <summary>
        /// Сохраняет файл с параметрами проекта.
        /// </summary>
        /// <param name="path">Путь сохранения.</param>
        public void Save(string path)
        {
            using (var sw = new StreamWriter(
                new FileStream(path, FileMode.Open, FileAccess.ReadWrite),
                Encoding.UTF8))
            {
                sw.Write(this.fileContent);
            }
        }
    }
}
